package controllers

import (
	"stacks/models"
	"stacks/services"
	"stacks/utils"

	"github.com/gin-gonic/gin"
)

// MenuController 菜单控制器
type MenuController struct {
	menuService *services.MenuService
}

// NewMenuController 创建菜单控制器实例
func NewMenuController() *MenuController {
	return &MenuController{
		menuService: services.NewMenuService(),
	}
}

// GetUserMenus 获取用户菜单
// @Summary 获取用户菜单
// @Description 获取当前登录用户的菜单列表
// @Tags 菜单
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Success 0   {object} map[string]interface{} "获取成功"
// @Failure 401 {object} map[string]interface{} "未授权"
// @Router /admin/menus [get]
func (c *MenuController) GetUserMenus(ctx *gin.Context) {
	// 从JWT中获取用户ID
	userID, exists := ctx.Get("userId")
	if !exists {
		utils.Unauthorized(ctx, "用户未登录")
		return
	}

	menus, err := c.menuService.GetUserMenus(userID.(uint))
	if err != nil {
		utils.InternalError(ctx, "获取菜单失败")
		return
	}

	// 转换为前端需要的格式
	menuTree := c.buildMenuTree(menus)

	utils.Success(ctx, gin.H{
		"list": menuTree,
	})
}

// buildMenuTree 构建菜单树结构
func (c *MenuController) buildMenuTree(menus []models.SysMenu) []map[string]interface{} {
	var menuTree []map[string]interface{}
	menuMap := make(map[uint]map[string]interface{})

	// 创建菜单映射
	for _, menu := range menus {
		menuItem := map[string]interface{}{
			"path":      menu.Path,
			"name":      menu.Name,
			"component": menu.Component,
			"redirect":  menu.Redirect,
			"meta": map[string]interface{}{
				"title":   menu.Title, // 直接使用title字符串，而不是嵌套结构
				"icon":    menu.Icon,
				"orderNo": menu.OrderNo,
			},
			"children": []map[string]interface{}{},
		}
		menuMap[menu.ID] = menuItem
	}

	// 构建树结构
	for _, menu := range menus {
		if menu.ParentID == 0 {
			menuTree = append(menuTree, menuMap[menu.ID])
		} else {
			if parent, exists := menuMap[menu.ParentID]; exists {
				children := parent["children"].([]map[string]interface{})
				children = append(children, menuMap[menu.ID])
				parent["children"] = children
			}
		}
	}

	return menuTree
}

// CreateDefaultMenus 创建默认菜单
// @Summary 创建默认菜单
// @Description 为指定租户创建默认菜单数据
// @Tags 菜单
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param tenantId query uint true "租户ID"
// @Success 0   {object} map[string]interface{} "创建成功"
// @Failure 400 {object} map[string]interface{} "请求参数错误"
// @Router /admin/menus/default [post]
func (c *MenuController) CreateDefaultMenus(ctx *gin.Context) {
	var req struct {
		TenantID uint `form:"tenantId" binding:"required"`
	}

	if err := ctx.ShouldBindQuery(&req); err != nil {
		utils.BadRequest(ctx, "请求参数错误")
		return
	}

	err := c.menuService.CreateDefaultMenus(req.TenantID)
	if err != nil {
		utils.InternalError(ctx, "创建默认菜单失败")
		return
	}

	utils.Success(ctx, "默认菜单创建成功")
}
